package com.example.yyj.tool;

import com.example.yyj.tool.BaiDu.TTS.TokenHolder;
import com.example.yyj.tool.BaiDu.TTS.ConnUtil;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

//百度文字转语音
public class TTSUtil {
    // 发音人选择, 基础音库：0为度小美，1为度小宇，3为度逍遥，4为度丫丫，
    // 精品音库：5为度小娇，103为度米朵，106为度博文，110为度小童，111为度小萌，默认为度小美
    private final int per = 0;
    // 语速，取值0-15，默认为5中语速
    private final int spd = 5;
    // 音调，取值0-15，默认为5中语调
    private final int pit = 5;
    // 音量，取值0-9，默认为5中音量
    private final int vol = 5;
    // 下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private final int aue = 6;
    public final String url = "http://tsn.baidu.com/text2audio"; // 可以使用https
    private String cuid = "15849880";

    /**
     * 文字转语音
     * @param Text 需要转换的文本
     * @return URL:声音的地址
     */
    public String TextToAudio(String Text){
        String Result="";//最后声音的返回结果(url)
        try{
            TokenHolder holder = new TokenHolder("YqE6cWHbdXeqDPCHs3tmW3hg","aGe2PMGLIWc9kvW1BBIEeCvwCGyMvYFo",TokenHolder.ASR_SCOPE);//获取令牌
            holder.refresh();//刷新Token
            String token = holder.getToken();//重新获取Token(令牌）
            String params = "tex=" + ConnUtil.urlEncode(ConnUtil.urlEncode(Text));//拼接请求字符串
            params += "&per=" + per;
            params += "&spd=" + spd;
            params += "&pit=" + pit;
            params += "&vol=" + vol;
            params += "&cuid=" + cuid;
            params += "&tok=" + token;
            params += "&aue=" + aue;
            params += "&lan=zh&ctp=1";
            System.out.println("最后请求URL"+params);
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();//发起HTTP连接
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setConnectTimeout(5000);//连接超时
            PrintWriter printWriter = new PrintWriter(connection.getOutputStream());
            printWriter.write(params);
            Result = url+"?"+params;
            printWriter.close();
            String contentType= connection.getContentType();//获取返回值类型
            if(contentType.contains("audio/")){//如果是音频，说明生成成功，将音乐保存
                byte [] bytes = ConnUtil.getResponseBytes(connection);//获得声音的数据流
                String format = getFormat(aue);//格式化
                File file = new File(UUID.randomUUID().toString()+"."+format);//生成文件
                FileOutputStream outputStream = new FileOutputStream(file);//存储文件
                outputStream.write(bytes);
                outputStream.close();
                System.out.println(file.getAbsolutePath());//输出文件的路径
            }else{//没有生成音频文件
                System.out.println("返回的类型是："+contentType);
                String res =ConnUtil.getResponseString(connection);
                System.out.println("最后结果"+res);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return Result;
    }
    // 下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private String getFormat(int aue) {
        String[] formats = {"mp3", "pcm", "pcm", "wav"};
        return formats[aue - 3];
    }
}
